/**
 * @file    main.c 
 * @author  18408107475@163.com
 * @version V1.0.0
 * @date    2025-07-15
 * @brief   基于MPU6050的六轴传感器数据采集与显示系统
 * @details 
 * 硬件配置：
 *   - 主控芯片：STM32F10x系列（如STM32F103C8T6）
 *   - 传感器：MPU6050（三轴加速度计+三轴陀螺仪，I2C接口）
 *   - 显示设备：OLED SSD1315（128x64分辨率，I2C接口）
 *   - 硬件连接：
 *     - MPU6050 SCL → PB6（需4.7K上拉电阻）
 *     - MPU6050 SDA → PB7（需4.7K上拉电阻）
 *     - MPU6050 AD0 → GND（I2C地址0x68）
 *     - OLED与MPU6050共用I2C总线（地址不同，无冲突）
 * 
 * 软件特性：
 *   - 初始化MPU6050为±16g加速度量程、±2000°/s陀螺仪量程
 *   - 实时采集六轴原始数据（加速度X/Y/Z，陀螺仪X/Y/Z）
 *   - 在OLED分区域显示传感器ID和六轴数据
 *   - 主循环无延时，数据刷新率取决于I2C通信速度（约100Hz）
 */

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"              // STM32标准外设库（核心寄存器定义）
#include "Delay.h"                  // 延时函数（初始化阶段等待传感器稳定）
#include "USART1_Config.h"          // USART1配置（备用调试接口，未使用）
#include "OLED_SSD1315_Config.h"    // OLED驱动库（显示数据）
#include "MPU6050_Config.h"         // MPU6050传感器驱动（数据采集）


/* 私有变量定义 --------------------------------------------------------------*/
u8 ID;                               // 存储MPU6050的设备ID（用于验证通信）
int16_t AX, AY, AZ;                  // 加速度计X/Y/Z轴原始数据（16位有符号整数）
int16_t GX, GY, GZ;                  // 陀螺仪X/Y/Z轴原始数据（16位有符号整数）


/**
 * @brief  主程序入口
 * @param  None
 * @retval int 程序状态码（实际不返回，因主循环为无限循环）
 * @执行流程：
 *   1. 初始化MPU6050传感器（配置量程、采样率等参数）
 *   2. 初始化OLED显示屏（I2C通信初始化、清屏）
 *   3. 读取MPU6050的设备ID并显示在OLED第0行
 *   4. 进入主循环：
 *      - 持续读取六轴原始数据
 *      - 在OLED指定位置显示各轴数据
 */
int main(void)
{
    // 初始化MPU6050：
    // - 唤醒传感器并选择时钟源
    // - 配置采样率100Hz，低通滤波器5Hz
    // - 加速度计量程±16g，陀螺仪量程±2000°/s
    MPU6050_Config();

    // 初始化OLED显示屏（I2C通信配置、寄存器初始化）
    OLED_SSD1315_Config();       

    // 清屏：清除OLED显存，初始化显示界面（全黑）
    OLED_SSD1315_Clear();       
    
    // 在OLED第0行显示固定文本"ID: "（字体16x16，左对齐）
    OLED_SSD1315_ShowString(0, 0, "ID: ", 16, false);
    
    // 读取MPU6050的设备ID（WHO_AM_I寄存器，默认0x68）
    ID = MPU6050_GetID();
    
    // 在"ID: "后显示设备ID（4位数字，右对齐补零）
    OLED_SSD1315_ShowNum(25, 0, ID, 4, 16);

    // 无限循环：持续采集并显示数据
    while (1)                   
    {
        // 读取六轴原始数据：
        // - 加速度计AX/AY/AZ（范围±32767，对应±16g）
        // - 陀螺仪GX/GY/GZ（范围±32767，对应±2000°/s）
        MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ);
        
        // 在OLED显示加速度计数据（第2行起，左半屏）
        OLED_SSD1315_ShowString(0, 2, "AX:", 8, false);  // 第2行显示"AX:"标签
        OLED_SSD1315_ShowNum(17,  2, AX, 6, 8);           // 第2行显示AX值（5位数字）
        
        OLED_SSD1315_ShowString(0, 4, "AY:", 8, false);  // 第4行显示"AY:"标签
        OLED_SSD1315_ShowNum(17,  4, AY, 6, 8);           // 第4行显示AY值
        
        OLED_SSD1315_ShowString(0, 6, "AZ:", 8, false);  // 第6行显示"AZ:"标签
        OLED_SSD1315_ShowNum(17,  6, AZ, 6, 8);           // 第6行显示AZ值
        
        // 在OLED显示陀螺仪数据（第2行起，右半屏）
        OLED_SSD1315_ShowString(66, 2, "GX:", 8, false); // 第2行显示"GX:"标签
        OLED_SSD1315_ShowNum(83, 2, GX, 6, 8);           // 第2行显示GX值
        
        OLED_SSD1315_ShowString(66, 4, "GY:", 8, false); // 第4行显示"GY:"标签
        OLED_SSD1315_ShowNum(83, 4, GY, 6, 8);           // 第4行显示GY值
        
        OLED_SSD1315_ShowString(66, 6, "GZ:", 8, false); // 第6行显示"GZ:"标签
        OLED_SSD1315_ShowNum(83, 6, GZ, 6, 8);           // 第6行显示GZ值
    }
}

/************************ (C) COPYRIGHT 2025 TS *****END OF FILE****/